package com.hujing;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * @Author : hujing
 * @Date: 2025/7/28 11:04
 * @Description:
 */
public class CompletableFutureDemo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // 1.无返回值
        CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
            System.out.println("任务开始执行（无返回值）");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("任务执行完成（无返回值）");
        });

        future.get(); // 等待任务执行完成

        System.out.println("主线程执行完成");

        // 2.有返回值
        CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("任务开始执行（有返回值）");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "hello world";
        });

        String result = future1.get();
        System.out.println("任务执行完成（有返回值）：" + result);

        // 3.thenApply 转换结果
        CompletableFuture.supplyAsync(() -> "100")
                .thenApply(Integer::parseInt)// 转换为int类型
                .thenApply(i -> i * 2)// 乘以2
                .thenAccept(System.out::println);// 输出结果
        
        try{
            Thread.sleep(2000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        
        System.out.println("thenApply 转换结果完成");
        
        // 4.thenCompose 组合任务（依赖前一个任务的结果）
    }
}
